import {isDef} from "../../../shared/util";

/**
 * 能进入 updateComponent 方法，说明 oldVNode 与 newVNode 一定是同类型的组件节点
 * 更新组件实例的模板内容
 * @param {VNode} oldVNode
 * @param {VNode} newVNode
 */
export function updateComponent (oldVNode, newVNode) {
    // 获取旧的节点的组件实例 (DOM 重新刷新，但是组件实例不变)
    // 同时更新 elem, 这样其他节点插入时，使用占位节点更新时，不会拿到错误的 DOM 节点
    if (isDef(oldVNode.componentInstance)) {
        newVNode.componentInstance = oldVNode.componentInstance;
        newVNode.elem = oldVNode.elem;
    }
    // 获取组件实例
    const componentInstance = newVNode.componentInstance;
    // 渲染组件实例模板的虚拟DOM树
    componentInstance.vnode = componentInstance.render();
    // 进行虚拟DOM树的比对，更新视图
    componentInstance.preVNode = componentInstance.__patch__(
        componentInstance.preVNode,
        componentInstance.vnode
    );
}
